{
 "cells": [
  {
   "cell_type": "markdown",
   "source": [
    "# Introduction to Tensors in Φ<sub>Flow</sub>\n",
    "\n",
    "[▶️ Introduction Video](https://youtu.be/4nYwL8ZZDK8)\n",
    "\n",
    "Like NumPy, TensorFlow, PyTorch and Jax, Φ<sub>Flow</sub> provides a [`Tensor` class](https://tum-pbs.github.io/PhiFlow/phi/math/#phiml.math.Tensor).\n",
    "There are, however, two crucial differences:\n",
    "\n",
    "1. Φ<sub>Flow</sub> tensors are backed by tensors of one of the other libraries, referred to as *native* tensors. All Φ<sub>Flow</sub> functions get translated into basic native operations.\n",
    "2. Dimensions of Φ<sub>Flow</sub> tensors have names and types. They are always referred to by name, not by their index. Reshaping takes place under-the-hood. The component can also be named."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "execution_count": 1
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [],
   "source": [
    "from phi.flow import *\n",
    "# from phi.torch.flow import *\n",
    "# from phi.tf.flow import *\n",
    "# from phi.jax.flow import *"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "Every dimension is assigned one of four types: [`channel`](https://tum-pbs.github.io/PhiFlow/phi/math/#phiml.math.channel), [`spatial`](https://tum-pbs.github.io/PhiFlow/phi/math/#phiml.math.spatial), [`instance`](https://tum-pbs.github.io/PhiFlow/phi/math/#phiml.math.instance) or [ `batch`](https://tum-pbs.github.io/PhiFlow/phi/math/#phiml.math.batch) (abbreviated as *c,s,i,b*).\n",
    "\n",
    "*Channel* dimensions enumerate properties of a single object, be it the velocity components of a particle or grid cell, or the RGB components of a pixel.\n",
    "\n",
    "Let's create a vector using [`math.vec`](https://tum-pbs.github.io/PhiFlow/phi/math/#phiml.math.vec). This creates a `Tensor` with a channel dimension called `vector`."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001B[92m(vectorᶜ=x,y)\u001B[0m\n",
      " 1, 0\n"
     ]
    }
   ],
   "source": [
    "point = vec(x=1, y=0)\n",
    "print(f\"{point:full:shape}\")"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "Here, `point` is a `Tensor` with one channel (*c*) dimension named `vector` that lists two components, `x` and `y`.\n",
    "Without the above formatting options, the vector will be printed in a more concise format."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [
    {
     "data": {
      "text/plain": "\u001B[94m(x=1, y=0)\u001B[0m"
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "point"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "We can use the built-in visualization tools to [`plot`](https://tum-pbs.github.io/PhiFlow/phi/vis/#phi.vis.plot) our point."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 864x360 with 1 Axes>"
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": "<Figure size 864x360 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot(point)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "Alternatively, we can wrap an existing native tensor.\n",
    "Then we have to specify the full shape."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "outputs": [
    {
     "data": {
      "text/plain": "\u001B[94m(x=1, y=0)\u001B[0m"
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wrap([1, 0], channel(vector='x,y'))"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "Next, let's create a collection of points at random locations.\n",
    "We can use an instance dimension to list the points."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "outputs": [
    {
     "data": {
      "text/plain": "\u001B[94m(x=-0.911, y=0.184)\u001B[0m; \u001B[94m(x=0.358, y=-0.785)\u001B[0m; \u001B[94m(x=0.593, y=0.269)\u001B[0m \u001B[92m(pointsⁱ=3, vectorᶜ=x,y)\u001B[0m"
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "points = math.random_normal(instance(points=3), channel(vector='x,y'))\n",
    "points"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 864x360 with 1 Axes>"
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": "<Figure size 864x360 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot(points)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "Φ<sub>Flow</sub> provides a concise syntax for accessing elements or slices of the tensor: `value.dimension[slice]`.\n",
    "This syntax can also be used on all Φ<sub>Flow</sub> objects, not just tensors."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "outputs": [
    {
     "data": {
      "text/plain": "\u001B[94m(x=-0.911, y=0.184)\u001B[0m"
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "points.points[0]"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "Since we have assigned item names to the `vector` dimension, we can access slices by name as well."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [
    {
     "data": {
      "text/plain": "\u001B[94m(-0.911, 0.358, 0.593)\u001B[0m along \u001B[92mpointsⁱ\u001B[0m"
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "points.vector['x']"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "There is an even shorter notation specifically for channel dimensions."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "outputs": [
    {
     "data": {
      "text/plain": "\u001B[94m(-0.911, 0.358, 0.593)\u001B[0m along \u001B[92mpointsⁱ\u001B[0m"
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "points['x']"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "To slice multiple dimensions, repeat the above syntax or pass a dictionary."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "outputs": [
    {
     "data": {
      "text/plain": "\u001B[94m-0.91106266\u001B[0m"
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "points.points[0].vector['x']"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "outputs": [
    {
     "data": {
      "text/plain": "\u001B[94m-0.91106266\u001B[0m"
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "points[{'points': 0, 'vector': 'x'}]"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "Spatial dimensions represent data sampled at regular intervals.\n",
    "Tensors with spatial dimensions are interpreted as grids and the higher-level grid classes make use of them.\n",
    "The grid resolution is equal to the"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "outputs": [
    {
     "data": {
      "text/plain": "\u001B[92m(xˢ=10)\u001B[0m \u001B[94m0.454 ± 0.245\u001B[0m \u001B[37m(1e-01...9e-01)\u001B[0m"
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grid = math.random_uniform(spatial(x=10))\n",
    "grid"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 864x360 with 1 Axes>"
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": "<Figure size 864x360 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot(grid)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "The number of spatial dimensions equals the dimensionality of the physical space."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 864x360 with 2 Axes>"
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": "<Figure size 864x360 with 2 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot(math.random_uniform(spatial(x=10, y=8)))"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "Tensors need not have identical shapes to be operated on jointly.\n",
    "Φ<sub>Flow</sub> automatically adds missing dimensions to tensors, i.e. tensors behave as if they were constant along every dimension that is not listed in their respective shapes."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 864x360 with 2 Axes>"
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": "<Figure size 864x360 with 2 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot(math.random_uniform(spatial(x=10)) * math.random_uniform(spatial(y=8)))"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "Finally, *batch* dimensions are the primary method of running computations in parallel.\n",
    "Slices along batch dimensions do not interact at all.\n",
    "Batch dimensions replace functions like `vmap` that exist in other frameworks."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 864x360 with 4 Axes>"
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": "<Figure size 864x360 with 4 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot(math.random_uniform(batch(examples=4), spatial(x=10, y=8)), show_color_bar=False)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "Tensors can be created from NumPy arrays as well as PyTorch, TensorFlow and Jax arrays.\n",
    "The dimension types and names need to be specified."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "outputs": [
    {
     "data": {
      "text/plain": "\u001B[92m(bᵇ=4, xˢ=32, yˢ=32)\u001B[0m \u001B[93mfloat64\u001B[0m \u001B[94mconst 0.0\u001B[0m"
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "t = tensor(np.zeros((4, 32, 32)), batch('b'), spatial('x,y'))\n",
    "t"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "While `tensor()` automatically converts the data to the default backend (specified by the `phi.**.flow` import), `wrap()` keeps the data as-is or wraps it in a NumPy array."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "outputs": [
    {
     "data": {
      "text/plain": "\u001B[92m(bᵇ=4, xˢ=32, yˢ=32)\u001B[0m \u001B[93mfloat64\u001B[0m \u001B[94mconst 0.0\u001B[0m"
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wrap(np.zeros((4, 32, 32)), batch('b'), spatial('x,y'))"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "To retrieve the native version of a tensor, use `.native(order)`, passing in the desired dimension order."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [
    {
     "data": {
      "text/plain": "array([[[0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.],\n        ...,\n        [0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.]],\n\n       [[0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.],\n        ...,\n        [0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.]],\n\n       [[0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.],\n        ...,\n        [0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.]],\n\n       [[0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.],\n        ...,\n        [0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.]]])"
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "t.native('b,y,x')"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "The NumPy representation can be retrieved the same way."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "outputs": [
    {
     "data": {
      "text/plain": "array([[[0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.],\n        ...,\n        [0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.]],\n\n       [[0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.],\n        ...,\n        [0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.]],\n\n       [[0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.],\n        ...,\n        [0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.]],\n\n       [[0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.],\n        ...,\n        [0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.],\n        [0., 0., 0., ..., 0., 0., 0.]]])"
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "t.numpy('b,y,x')"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## Further Reading\n",
    "\n",
    "* [`Φ.math` Overview](https://tum-pbs.github.io/PhiFlow/Math.html)\n",
    "* [Optimization and Training](Optimization.md): Automatic differentiation, neural network training\n",
    "* [Performance](GPU_Execution.md): GPU, JIT compilation, profiler"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}